/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUIaVykreslovanie;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

/**
 *  Trieda, ktorá zaisťuje používateľské rozhranie na prácu so šablónami zamestnancov
 * 
 * @author MartinaHlinková
 */
public class MiniGUIZamestnanci extends JFrame {
   final private Sablony.SablonaZamestnancov sablonaZamestnancovMini;
   private JTable tabulka;
   private boolean novaSablona;
   private Sablony.Zamestnanec aktivnyZamestnanec ;
    /**
     * konštanta maximálneho počtu znakov, ktoré množno vložiť do textových vstupov
     */
    final static int MAX_DLZKA_VSTUPU = 64;
    
    /**
     * Konštruktor triedy MiniGUIZamestnanci, ktorý vytvára novú prázdnu šablónu zamestnancov
     * a zobrazuje ju v editore
     * 
     * @param menoSablony názov novej šablóny zamestnancov
     */
    public MiniGUIZamestnanci(String menoSablony){
        sablonaZamestnancovMini = new Sablony.SablonaZamestnancov(menoSablony);
        this.novaSablona = true;
         try{

            initMetoda();
            this.setVisible(true); // okno zviditelnit
	    this.toFront(); // okno dat do popredia
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     *  Konštruktor triedy MiniGUIZamestnanci, ktorý zobrazuje už existujúcu šablónu
     * zamestnancov
     * 
     * @param menoSablony   meno zobrazovanej šablóny
     * @param sablona zobrazovaná šablóna
     */
    public MiniGUIZamestnanci(String menoSablony, Sablony.SablonaZamestnancov sablona){
        sablonaZamestnancovMini = sablona;
        this.novaSablona = false;
        this.aktivnyZamestnanec = null;
        
        try{

            initMetoda();
            this.setVisible(true); // okno zviditelnit
	    this.toFront(); // okno dat do popredia
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     * Metóda zobrazujúca a obsluhujúca prvky Minieditoru zamestnancov 
     */
      private void initMetoda(){
        final int OKNO_CAST = 70; // percento z celej plochy obrazovky
        Toolkit t = Toolkit.getDefaultToolkit();
	Dimension d = t.getScreenSize();
		
        this.setLocation(d.width * (100 - OKNO_CAST) / 100 / 2, d.height
				* (100 - OKNO_CAST) / 100 / 2); // zadanie laveho horneho horu
        this.setSize(d.width * OKNO_CAST / 50, d.height * OKNO_CAST / 100); 
        this.setResizable(true); // je mozne menit velkost okna
	this.setTitle("Luba - Editor šablony zamestnancov"); // titulok
        this.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
																		// okna
        // ukoncenie cez udalost WindowEvent
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setLayout(new BorderLayout(2, 2));
        
        JPanel lista = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JScrollPane scrollPane = new JScrollPane();
        JButton buttonNovyZamestnanec = new JButton("Nový zamestnanec");
        JButton buttonZmazZamestnanca = new JButton("Zmaž zamestnanca");
        JButton buttonUlozSablonu = new JButton("Ulož");
        JButton buttonNastavNepritomnost = new JButton("Nastav neprítomnosť");
        JButton buttonOdid = new JButton("Odíď");
        
        
        lista.setBackground(Color.LIGHT_GRAY);
	this.add(BorderLayout.NORTH, lista);
	this.add(BorderLayout.SOUTH,scrollPane);
        
        lista.add(buttonNovyZamestnanec); 
        lista.add(buttonZmazZamestnanca); 
        lista.add(buttonUlozSablonu );
        lista.add(buttonNastavNepritomnost);
        lista.add(buttonOdid); 
        
        tabulka = new JTable();
        tabulka.setModel(new DefaultTableModel(
                new Object[][]{},
                new String[]{"ID","Meno","Priezvisko","Titul","Funkcia","Pohlavie","Sila","Typ zamestnanca"}
                ){
                    Class[] types = new Class[]{String.class,String.class,String.class,String.class,String.class,String.class,String.class,String.class};
            @Override
                    public Class getColumnClass(int columnIndex){
                        return types[columnIndex];
                    }
                });
        
        for(Sablony.Zamestnanec zamestnanecVSablone: this.sablonaZamestnancovMini.getZamestnanciVSablone()){
             DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
             model.addRow(new Object[]{zamestnanecVSablone.getIDZamestnanca(),zamestnanecVSablone.getMenoZamestnanca(),zamestnanecVSablone.getPriezviskoZamestnanca()
                                     ,zamestnanecVSablone.getTitulZamestnanca(), zamestnanecVSablone.getFunkciaZamestnanca(), zamestnanecVSablone.getPohlavieZamestnanca()
                                     ,zamestnanecVSablone.getSilaZamestnanca(), zamestnanecVSablone.getTypZamestnanca()});
        }
        
        scrollPane.setViewportView(tabulka);
        ListSelectionModel selectionModel = tabulka.getSelectionModel();  
        selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
        pack();
        
        tabulka.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent event){
                if ( SwingUtilities.isLeftMouseButton(event) )
		{
			Point p = event.getPoint();
			int rowNumber = tabulka.rowAtPoint( p );
                        ListSelectionModel model = tabulka.getSelectionModel();
			model.setSelectionInterval( rowNumber, rowNumber );
                        int idZamestnancaRow = Integer.parseInt(tabulka.getValueAt(rowNumber, 0).toString());
                        aktivnyZamestnanec = sablonaZamestnancovMini.najdiZamestnancaPodlaID(idZamestnancaRow);
                        
		}
            }
        });
        
        buttonNovyZamestnanec.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_pridanieZamestnancaDoTabulky();
			}
		});
        
        buttonZmazZamestnanca.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                if(aktivnyZamestnanec != null)akcia_zmazOznacenehoZamestnanca();
			}
		});
        
        buttonUlozSablonu.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_zapisSablonyDoXML();
			}
		});
        
        buttonOdid.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_ukonciMiniGUI();
			}
		});
        buttonNastavNepritomnost.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                              if(aktivnyZamestnanec != null){
                                    akcia_zobrazNepritomnost();
                                }else{
                                    JOptionPane.showMessageDialog(null,"Nie je označený žiaden zamestnanec z tabuľky.");
                                }
			
			}
		});
      }
      /**
       * Metóda, ktorá ukončuje činnosť minieditora zamestnancov
       */
      private void akcia_ukonciMiniGUI(){
           this.disable();
            this.dispose();
      }
      
      /**
       * Metóda, ktorá zobrazuje dialógové okno s blokmi neprítomnosti zamestnanca vybraného 
       * v tabuľke šablóny zamestnancov. Dialógové okno je typu DialogNepritomnostiZamestnanca,
       * čo je vnútorná trieda triedy MiniGUIZamestnanci
       */
      private void akcia_zobrazNepritomnost(){
       MiniGUIZamestnanci.DialogNepritomnostiZamestnanca dialogNepritomnosti;
       
       dialogNepritomnosti = new MiniGUIZamestnanci.DialogNepritomnostiZamestnanca(this,this.aktivnyZamestnanec);
       dialogNepritomnosti.show();
      }
      
      /**
       * Metóda, zapisujúca šablónu zamestnancov do trvalej pamäti
       */
      private void  akcia_zapisSablonyDoXML(){
          if(this.novaSablona == true){
            this.sablonaZamestnancovMini.novaXMLSablona();
          }else{
           this.sablonaZamestnancovMini.novaXMLSablona();
          }
      }
      
      /**
       * Metóda, ktorá umožní používateľovi vytvoriť nový blok neprítomnosti zamestnanca.
       * @return vytvorená nová neprítomnosť zamestnanca
       */
      private Sablony.NepritomnostZamestnanca akcia_napln_novu_nepritomnost(){
            InformacnaStruktura.CasBezDatumu casOd,casDo;
            InformacnaStruktura.Den den = null;
            MiniGUIZamestnanci.DialogNovejNepritomnosti dialog;
            Sablony.NepritomnostZamestnanca navrat = null;
            try{
            dialog = new MiniGUIZamestnanci.DialogNovejNepritomnosti(this);
            dialog.show();
            
            //cas od
            casOd = dialog.getCasOd();
            //cas do
            casDo = dialog.getCasDo();
            //den nepritomnosti
            String denString = dialog.denChoice.getSelectedItem();
            
            final InformacnaStruktura.Den[] dni = InformacnaStruktura.Den.values();
                for(InformacnaStruktura.Den iterator: dni){
                    if(denString.equals(iterator.toString())== true){
                        den = iterator;
                    }
                }
            
            if(den == null || casOd == null || casDo == null){
                return null;
            }else{
                navrat = new Sablony.NepritomnostZamestnanca(den,casOd, casDo);
            }
        }
             catch(NumberFormatException ex){
            JOptionPane.showMessageDialog(this,"Zadali ste nespravny tvar ID.");
		this.repaint();
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
            return navrat;
    }
      /**
       * Metóda, ktorá zmaže označeného zamestnanca ako zo štruktúry šablóny zamestnancov
       * tak i z tabuľky minieditoru
       */
      private void akcia_zmazOznacenehoZamestnanca(){
          DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
          System.out.println("zmazanie zamestnanca");
            if(model != null && model.getRowCount() > 0 ){
                System.out.println(model);
                System.out.println(model.getRowCount());
                for(int i = (model.getRowCount()- 1); i >= 0; i--){
                    String hladanyKlient=tabulka.getValueAt(i, 0).toString();
                    System.out.println(i+" "+hladanyKlient);
                    System.out.println(""+this.aktivnyZamestnanec.getIDZamestnanca());
                    if(hladanyKlient.equals(""+this.aktivnyZamestnanec.getIDZamestnanca())){
                        model.removeRow(i);
                        this.sablonaZamestnancovMini.odoberZamestnanca(aktivnyZamestnanec);
                        aktivnyZamestnanec =null;
                    }
                }
            }
      }
       /**
        * Metóda, ktorá pridá nového zamestnanca do šablóny zamestnancov
        */
      private void akcia_pridanieZamestnancaDoTabulky(){
           Sablony.Zamestnanec novy = akcia_napln_noveho_zamestnanca();
                               if(novy == null){
                                    JOptionPane.showMessageDialog(null,"Zamestnanec nebol pridany.");
                                }else if(sablonaZamestnancovMini.pridajZamestnanca(novy) == false){
                                    JOptionPane.showMessageDialog(null,"Zamestnanec nebol správne vyplnený.");
                                }else{
                                     DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
                                     model.addRow(new Object[]{novy.getIDZamestnanca(),novy.getMenoZamestnanca(),novy.getPriezviskoZamestnanca()
                                     ,novy.getTitulZamestnanca(), novy.getFunkciaZamestnanca(), novy.getPohlavieZamestnanca()
                                     ,novy.getSilaZamestnanca(), novy.getTypZamestnanca()});
                                } 
      }
      
      /**
       * Metóda, ktorá umožní používateľovi vytvoriť nového zamestnanca
       * @return novovytvorený zamestnanec
       */
      private Sablony.Zamestnanec akcia_napln_noveho_zamestnanca(){
        int noveID = 0;
        String noveMeno = "";
        String novePriezvisko="";
        String novyTitul = "";
        Sablony.Funkcia novaFunkcia = null;
        Sablony.Pohlavie novePohlavie = null;
        Sablony.SiloveUlohy novaSila = null;
        Sablony.TypZamestnanca novyTyp = null;
        String neskontrolovaneID,neskontrolovaneMeno,neskontrolovanePriezvisko,neskontrolovanyTitul;
        DialogNovehoZamestnanca dialog;
        
        try{
        dialog = new MiniGUIZamestnanci.DialogNovehoZamestnanca(this);
        dialog.show();
       
        neskontrolovaneID = dialog.getID();
        neskontrolovaneMeno = dialog.getMeno();
        neskontrolovanePriezvisko = dialog.getPriezvisko();
        neskontrolovanyTitul = dialog.getTitul();
        
        if(neskontrolovaneID == null || neskontrolovaneMeno == null){
            return null;
        }
                
         noveID = Integer.parseInt(neskontrolovaneID);
   
         if(neskontrolovaneMeno.contains("\\") ||neskontrolovaneMeno.contains("/") ||neskontrolovaneMeno.contains(".") || neskontrolovaneMeno.contains("%") ){
                    JOptionPane.showMessageDialog(this,"Meno obsahuje nepovolené znaky(. / % \\)");
                    this.repaint();
                    return null;
                }
         noveMeno = neskontrolovaneMeno;
         
         
         if(neskontrolovanePriezvisko.contains("\\") ||neskontrolovanePriezvisko.contains("/") ||neskontrolovanePriezvisko.contains(".") || neskontrolovanePriezvisko.contains("%") ){
                    JOptionPane.showMessageDialog(this,"Priezvisko obsahuje nepovolené znaky(. / % \\)");
                    this.repaint();
                    return null;
                }
         novePriezvisko = neskontrolovanePriezvisko;
         
         if(neskontrolovanyTitul.equals("")){
             novyTitul = "";
         }else
         if(neskontrolovanyTitul.contains("\\") ||neskontrolovanyTitul.contains("/") ||neskontrolovanyTitul.contains(".") || neskontrolovanyTitul.contains("%") ){
                    JOptionPane.showMessageDialog(this,"Titul obsahuje nepovolené znaky(. / % \\)");
                    this.repaint();
                    return null;
         }else{
             novyTitul = neskontrolovanyTitul;
         }
         
         novaFunkcia = dialog.getFunkcia();

         novePohlavie = dialog.getPohlavie();
  
         novaSila = dialog.getSila();
 
         novyTyp = dialog.getTyp();
 
        }
       
        catch(Exception ex){
            ex.printStackTrace();
        }
        Sablony.Zamestnanec novy = new Sablony.Zamestnanec(noveID,noveMeno,novePriezvisko,novyTitul,novaFunkcia,novePohlavie,novaSila,novyTyp);
        return novy;
      }
      
      /**
       * Vnútorná trieda triedy MiniGUIZamestnanci ako dialógové okno, v ktorom používateľ môže vytvoriť nového zamestnanca a 
       * nastaviť mu požadované vlastnosti
       */
       private class DialogNovehoZamestnanca extends Dialog implements ActionListener{
        TextField fieldID, fieldMeno,fieldPriezvisko, fieldTitul;
        Choice choiceFunkcia,choicePohlavie,choiceSila,choiceTyp;
        /**
         * Konštruktor vnútornej triedy. Vykresluje a obsluhuje prvky dialógového okna
         * @param vlastnik rodičovské okno, z ktorého voláme objekt tejto triedy
         */
         DialogNovehoZamestnanca(JFrame vlastnik){
            super(vlastnik, "Dialog nového zamestnanca", true);
            this.setLayout(new GridLayout(9,2,5,5));
            
            this.setSize(800,250);
            
            this.setModal(true);
            
            fieldID = new TextField(5);
            fieldMeno = new TextField(MAX_DLZKA_VSTUPU);
            fieldPriezvisko = new TextField(MAX_DLZKA_VSTUPU);
            fieldTitul = new TextField(MAX_DLZKA_VSTUPU);
            
            choiceFunkcia = new Choice();
            final Sablony.Funkcia[] funkcie = Sablony.Funkcia.values();
            for(Sablony.Funkcia iterator: funkcie){
                choiceFunkcia.addItem(iterator.toString());
            }
            
            choicePohlavie = new Choice();
            final Sablony.Pohlavie[] pohlavia = Sablony.Pohlavie.values();
            for(Sablony.Pohlavie iterator: pohlavia){
                choicePohlavie.addItem(iterator.toString());
            }
            
            choiceSila = new Choice();
            final Sablony.SiloveUlohy[] siloveUlohy = Sablony.SiloveUlohy.values();
            for(Sablony.SiloveUlohy iterator: siloveUlohy){
                choiceSila.addItem(iterator.toString());
            }
            
            choiceTyp = new Choice();
            final Sablony.TypZamestnanca[] typy = Sablony.TypZamestnanca.values();
            for(Sablony.TypZamestnanca iterator: typy){
                choiceTyp.addItem(iterator.toString());
            }
            
            JLabel popisID = new JLabel("Id zamestnanca - číslo od 10 do 99");
            JLabel popisMeno = new JLabel("Meno zamestnanca");
            JLabel popisPriezvisko = new JLabel("Priezvisko zamestnanca");
            JLabel popisTitul = new JLabel("Titul zamestnanca");
            JLabel popisFunkcia = new JLabel("Titul funkcia");
            JLabel popisPohlavie = new JLabel("Pohlavie zamestnanca");
            JLabel popisSila = new JLabel("Sila zamestnanca");
            JLabel popisTyp = new JLabel("Typ zamestnanca");
            
            JButton buttonPotvrd = new JButton("Potvrď");
            JButton buttonOdid = new JButton("Odíď");
              
            this.add(popisID);
            this.add(fieldID);
            this.add(popisMeno);
            this.add(fieldMeno);
            this.add(popisPriezvisko);
            this.add(fieldPriezvisko);
            this.add(popisTitul);
            this.add(fieldTitul);
            this.add(popisFunkcia);
            this.add(choiceFunkcia);
            this.add(popisPohlavie);
            this.add(choicePohlavie);
            this.add(popisSila);
            this.add(choiceSila);
            this.add(popisTyp);
            this.add(choiceTyp);

            this.add(buttonPotvrd);
            this.add(buttonOdid);
            
            buttonPotvrd.addActionListener(this);
            buttonOdid.addActionListener(new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent e) {
                    fieldID = null;
                    fieldMeno = null;
                    fieldPriezvisko = null;
                    fieldTitul = null;
                    choiceFunkcia = null;
                    choicePohlavie = null;
                    choiceSila = null;
                    choiceTyp = null;
                    dispose();
                }
            });
            
            //pack();
       
        }
        /**
         * Metóda vracajúca text textového poľa s identifikačným číslom
         * @return textový reťazec, v ktorom by malo byť identifikačné číslo
         */
        public String getID(){
            return fieldID.getText();
        }
        /**
         *  Metóda vracajúca text textového poľa s menom zamestnanca
         * @return textové pole s menom zamestnanca
         */
        public String getMeno(){
            return fieldMeno.getText();
        } 
        /**
         * Metóda vracajúca text textového poľa s priezviskom zamestnanca
         * @return textové pole s priezviskom zamestnanca
         */
        public String getPriezvisko(){
            return fieldPriezvisko.getText();
        }
        /**
         * Metóda vracajúca text textového poľa s titulom zamestnanca
         * @return textové pole s titulom zamestnanca
         */
        public String getTitul(){
            return fieldTitul.getText();
        } 
        /**
         * Metóda vracajúca funkciu zamestnanca
         * @return funkcia zamestnanca ako objekt triedy Funkcia
         */
        public Sablony.Funkcia getFunkcia(){
            String funkciaString = choiceFunkcia.getSelectedItem().toString();
            
            final Sablony.Funkcia[] funkcie = Sablony.Funkcia.values();
            for(Sablony.Funkcia iterator: funkcie){
                if(funkciaString.equals(iterator.toString()) == true){
                    return iterator;
                }
            }
            return null;
        }
        /**
         * Metóda vracajúca pohlavie zamestnanca
         * @return pohlavie zamestnanca ako objekt typu Pohlavie
         */
        public Sablony.Pohlavie getPohlavie(){
            String pohlavieString = choicePohlavie.getSelectedItem().toString();

            final Sablony.Pohlavie[] pohlavie = Sablony.Pohlavie.values();
            for(Sablony.Pohlavie iterator: pohlavie){
                if(pohlavieString.equals(iterator.toString()) == true){
                    return iterator;
                }
            }
            return null;
        }
        /**
         * Metóda vracajúca silu zamestnanca
         * @return sila zamestnanca ako objekt typu SiloveUlohy
         */
        public Sablony.SiloveUlohy getSila(){
            String silaString = choiceSila.getSelectedItem().toString();

            final Sablony.SiloveUlohy[] sila = Sablony.SiloveUlohy.values();
            for(Sablony.SiloveUlohy iterator: sila){
                if(silaString.equals(iterator.toString()) == true){
                    return iterator;
                }
            }
            return null;
        } 
        /**
         * Metóda vracajúca typ zamestnanca
         * @return sila zamestnanca ako objekt typu TypZamestnanca
         */
        public Sablony.TypZamestnanca getTyp(){
            String typString = choiceTyp.getSelectedItem().toString();

            final Sablony.TypZamestnanca[] typ = Sablony.TypZamestnanca.values();
            for(Sablony.TypZamestnanca iterator: typ){
                if(typString.equals(iterator.toString()) == true){
                    return iterator;
                }
            }
            return null;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            boolean ok = true;
            if(this.fieldID.getText() == null || this.fieldID.getText().isEmpty()){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadané identifikačné číslo.");
            }
            if(ok == true &&(Integer.parseInt(this.fieldID.getText())< 10 || Integer.parseInt(this.fieldID.getText())>99)){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nesprávny tvar identifikačného čísla.");
            }
           if(ok == true &&(this.fieldMeno.getText() == null || this.fieldMeno.getText().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadané meno zamestnanca.");
            }
           if(ok == true && (this.fieldMeno.getText().contains("\\") ||this.fieldMeno.getText().contains("/") ||this.fieldMeno.getText().contains(".") || this.fieldMeno.getText().contains("%") )){
                    JOptionPane.showMessageDialog(this,"Meno obsahuje nepovolené znaky(. / % \\)");
                    ok = false;
                }
           if(ok == true &&(this.fieldPriezvisko.getText() == null || this.fieldPriezvisko.getText().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadané priezvisko zamestnanca.");
            }
           if(ok == true && (this.fieldPriezvisko.getText().contains("\\") ||this.fieldPriezvisko.getText().contains("/") ||this.fieldPriezvisko.getText().contains(".") || this.fieldPriezvisko.getText().contains("%") )){
                    JOptionPane.showMessageDialog(this,"Priezvisko obsahuje nepovolené znaky(. / % \\)");
                    ok = false;
                }
           if(ok == true && this.fieldTitul.getText() != null && (this.fieldTitul.getText().contains("\\") ||this.fieldTitul.getText().contains("/") ||this.fieldTitul.getText().contains(".") || this.fieldTitul.getText().contains("%") )){
                    JOptionPane.showMessageDialog(this,"Titul obsahuje nepovolené znaky(. / % \\)");
                    ok = false;
                }
            if(ok == true &&(this.choiceFunkcia.getSelectedItem() == null || this.choiceFunkcia.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadaná funkcia zamestnanca.");
            }
            if(ok == true &&(this.choicePohlavie.getSelectedItem() == null || this.choicePohlavie.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadané pohlavie zamestnanca.");
            }
            if(ok == true &&(this.choiceSila.getSelectedItem() == null || this.choiceSila.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadaná sila zamestnanca.");
            }
            if(ok == true &&(this.choiceTyp.getSelectedItem() == null || this.choiceTyp.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(this,"Nie je zadaný typ zamestnanca.");
            }
            if(ok == true){
                this.dispose();
            }
            
        }
       }
       /**
        * Vnútorná trieda triedy MiniGUIZamestnanci ako dialógové okno, v ktorom používateľ môže
        * prehialať bloky neprítomnosti konkrétneho zamestnanca, vkladať nové bloky alebo vymazávať
        */
       private class DialogNepritomnostiZamestnanca extends Dialog implements ActionListener{
            private Sablony.Zamestnanec zamestnanecNepritomnosti;
            private JTable tabulka;
            private Sablony.NepritomnostZamestnanca aktivnaNepritomnost;
            /**
             * Konštruktor vnútornej triedy. Vykresluje a obsluhuje prvky dialógového okna
             * @param vlastnik rodičovské okno, z ktorého voláme objekt tejto triedy
             */
            DialogNepritomnostiZamestnanca(JFrame vlastnik,Sablony.Zamestnanec zamestnanec){
                super(vlastnik,"Dialog prítomnosti klienta "+ zamestnanec.getMenoZamestnanca()+" "+zamestnanec.getPriezviskoZamestnanca(),true);
                this.zamestnanecNepritomnosti = zamestnanec;
                this.setLayout(new BorderLayout(2, 2));
                this.setSize(500,500);
                this.setModal(true);
                
                JPanel lista = new JPanel(new FlowLayout(FlowLayout.LEFT));
                JScrollPane scrollPane = new JScrollPane();
                JButton buttonNovaNepritomnost = new JButton("Nová neprítomnosť");
                JButton buttonVymazNepritomnost = new JButton("Vymaž neprítomnosť");
                JButton buttonOdid = new JButton("Odíď");
                
                this.add(BorderLayout.NORTH,lista);
                this.add(BorderLayout.SOUTH,scrollPane);
                lista.add(buttonNovaNepritomnost);
                lista.add(buttonVymazNepritomnost);
                lista.add(buttonOdid);
                tabulka = new JTable();
                
                tabulka.setModel(new DefaultTableModel(
                new Object[][]{},
                new String[]{"Deň","Čas od","Čas do"}
                ){
                    Class[] types = new Class[]{String.class,String.class,String.class};
            @Override
                    public Class getColumnClass(int columnIndex){
                        return types[columnIndex];
                    }
                });
                
                DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
                for(Sablony.NepritomnostZamestnanca iterator: zamestnanec.getNepritomnost()){
                    model.addRow(new Object[]{iterator.getDenNepritomnosti().toString(),iterator.getCasOdkedy().toString(),iterator.getCasDokedy().toString()});
                }
            scrollPane.setViewportView(tabulka);
            ListSelectionModel selectionModel = tabulka.getSelectionModel();  
            selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            
            tabulka.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent event){
                if ( SwingUtilities.isLeftMouseButton(event) )
		{
			Point p = event.getPoint();
			int rowNumber = tabulka.rowAtPoint( p );
                        ListSelectionModel model = tabulka.getSelectionModel();
			model.setSelectionInterval( rowNumber, rowNumber );
                        
                        String hladanyCas=tabulka.getValueAt(rowNumber, 0).toString();
                        
                        aktivnaNepritomnost =zamestnanecNepritomnosti.najdiNepritomnostPodlaDna(hladanyCas);
                       
		}
            }
            });
            
            buttonNovaNepritomnost.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                                akcia_pridajNovuNepritomnostDoTabulky();
			}
		});
            
            buttonVymazNepritomnost.addActionListener(new ActionListener() { // anonym. vnut. trieda pre udalost
			public void actionPerformed(ActionEvent e) {
                               if(aktivnaNepritomnost != null){
                                    akcia_zmazOznacenuNepritomnost();
                                }
			}
		});
            buttonOdid.addActionListener(this);
            
        }
            

        @Override
        public void actionPerformed(ActionEvent e) {
            this.dispose();
        }
        /**
         * Metóda, ktorá pridá novú neprítomnosť do šablóny zamestnancov a vykreslí
         * ju do tabuľky
         */
        private void akcia_pridajNovuNepritomnostDoTabulky(){
            Sablony.NepritomnostZamestnanca novy = akcia_napln_novu_nepritomnost(); 
            if(novy == null){
                JOptionPane.showMessageDialog(this,"Nesprávne vyplnenie nepritomnosti.");
            }else if(this.zamestnanecNepritomnosti.pridajNepritomnost(novy) == false){
                JOptionPane.showMessageDialog(this,"Takato nepritomnost uz existuje alebo casy nepritomnosti sa prekryvaju.");
            }else{
                DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
                model.addRow(new Object[]{novy.getDenNepritomnosti().toString(),novy.getCasOdkedy().toString(),novy.getCasDokedy().toString()});
            }
        }
        /**
         * Metóda, ktorá zmaže vybranú neprítomnosť zo šablóny zamestnancov
         */
        private void akcia_zmazOznacenuNepritomnost(){
              DefaultTableModel model =(DefaultTableModel) tabulka.getModel();
                if(model.getRowCount() > 0){
                    for(int i = (model.getRowCount()- 1); i >= 0; i--){
                        String hladanyCas=tabulka.getValueAt(i, 1).toString();
                        String hladanyDen=tabulka.getValueAt(i, 0).toString();
                        if(hladanyCas.equals(this.aktivnaNepritomnost.getCasOdkedy().toString()) && hladanyDen.equals(this.aktivnaNepritomnost.getDenNepritomnosti().toString())){
                            model.removeRow(i);
                            this.zamestnanecNepritomnosti.odoberNepritomnost(aktivnaNepritomnost);
                            this.aktivnaNepritomnost = null;
                        }
                    }
                }
            
         }
       }// koniec triedy DialogNepritomnostiZamestnanca
       
       /**
       * Vnútorná trieda triedy MiniGUIZamestnanci ako dialógové okno, v ktorom používateľ môže vytvoriť
       * novú neprítomnosť zamestnanca a nastaviť jej požadované vlastnosti
       */
        private class DialogNovejNepritomnosti extends Dialog implements ActionListener{
            Choice denChoice,hodinaOdChoice,hodinaDoChoice,minutaOdChoice,minutaDoChoice;
        
         /**
         * Konštruktor vnútornej triedy. Vykresluje a obsluhuje prvky dialógového okna
         * @param vlastnik rodičovské okno, z ktorého voláme objekt tejto triedy
         */
           public DialogNovejNepritomnosti(JFrame vlastnik){
                super(vlastnik, "Dialog novej nepritomnosti", true);
                this.setLayout(new GridLayout(5,3,5,5));
                this.setSize(500,200);
                this.setModal(true);
                
                //prvy riadok gridlayout
                this.add(new JLabel(""));
                this.add(new JLabel("Hodina"));
                this.add(new JLabel("Minuta"));
                
                //druhy riadok gridlayout
                this.add(new JLabel("Čas odkedy"));
                hodinaOdChoice = new Choice();
                for(int i=0; i<24; i++){
                    hodinaOdChoice.addItem(""+i);
                }
                minutaOdChoice =  new Choice();
                for(int i=0; i<60; i++){
                    minutaOdChoice.addItem(""+i);
                }
                
                this.add(hodinaOdChoice);
                this.add(minutaOdChoice);
                
                //treti riadok gridlayout
                
                this.add(new JLabel("Čas dokedy"));
                hodinaDoChoice = new Choice();
                for(int i=0; i<24; i++){
                    hodinaDoChoice.addItem(""+i);
                }
                minutaDoChoice =  new Choice();
                for(int i=0; i<60; i++){
                    minutaDoChoice.addItem(""+i);
                }
                
                this.add(hodinaDoChoice);
                this.add(minutaDoChoice);
                
                //stvrty riadok gridLayout
                this.add(new JLabel("Deň v týždni"));
                denChoice = new Choice();
                final InformacnaStruktura.Den[] dni = InformacnaStruktura.Den.values();
                for(InformacnaStruktura.Den iterator: dni){
                    denChoice.addItem(iterator.toString());
                }
                this.add(denChoice);
                this.add(new JLabel(""));

                //piaty riadok gridlayout
                JButton buttonPotvrd = new JButton("Potvrď");
                JButton buttonOdid = new JButton("Odíď");
                this.add(buttonPotvrd);
                this.add(buttonOdid);
                
                buttonPotvrd.addActionListener(this);
            
            buttonOdid.addActionListener(new ActionListener() { 
			public void actionPerformed(ActionEvent e) {
                                denChoice = null;
                                hodinaOdChoice = null;
                                hodinaDoChoice = null;
                                minutaOdChoice = null;
                                minutaDoChoice = null;
                                dispose();
			}
		});
                
           }
        /**
         * Metóda vracajúca čas odkedy trvá blok neprítomnosti zamestnanca
         * @return cas odkedy trvá neprítomnosť zamestnanca ako objekt triedy CasBezDatumu
         */
        public InformacnaStruktura.CasBezDatumu getCasOd(){
            String hodina = this.hodinaOdChoice.getSelectedItem();
            String minuta= this.minutaOdChoice.getSelectedItem();
            InformacnaStruktura.CasBezDatumu navrat = new InformacnaStruktura.CasBezDatumu(Integer.parseInt(hodina),Integer.parseInt(minuta));
            return navrat;
        }
        /**
         * Metóda vracajúca čas dokedy trvá blok neprítomnosti zamestnanca
         * @return cas dokedy trvá neprítomnosť zamestnanca ako objekt triedy CasBezDatumu
         */
        public InformacnaStruktura.CasBezDatumu getCasDo(){
            String hodina = this.hodinaDoChoice.getSelectedItem();
            String minuta= this.minutaDoChoice.getSelectedItem();
            InformacnaStruktura.CasBezDatumu navrat = new InformacnaStruktura.CasBezDatumu(Integer.parseInt(hodina),Integer.parseInt(minuta));
            return navrat;
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            boolean ok = true;
            if(this.denChoice == null || this.denChoice.getSelectedItem() == null || this.denChoice.getSelectedItem().isEmpty()){
                ok = false;
                JOptionPane.showMessageDialog(null,"Nie je zadaný deň.");
            }
            if(ok == true &&(this.hodinaOdChoice == null || this.hodinaOdChoice.getSelectedItem() == null || this.hodinaOdChoice.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(null,"Nie je zadaná hodina odkedy.");
            }
            if(ok == true &&(this.hodinaDoChoice == null || this.hodinaDoChoice.getSelectedItem() == null || this.hodinaDoChoice.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(null,"Nie je zadaná hodina dokedy.");
            }
            if(ok == true &&(this.minutaOdChoice == null || this.minutaOdChoice.getSelectedItem() == null || this.minutaOdChoice.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(null,"Nie je zadaná minúta odkedy.");
            }
            if(ok == true &&(this.minutaOdChoice == null || this.minutaOdChoice.getSelectedItem() == null || this.minutaOdChoice.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(null,"Nie je zadaná minúta odkedy.");
            }
            if(ok == true &&(this.minutaDoChoice == null || this.minutaDoChoice.getSelectedItem() == null || this.minutaDoChoice.getSelectedItem().isEmpty())){
                ok = false;
                JOptionPane.showMessageDialog(null,"Nie je zadaná minúta dokedy.");
            }
            if(ok == true){
                this.dispose();
            }
        }
        }
}
